home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Very Best of Atari Inside
/
The Very Best of Atari Inside 1.iso
/
mint
/
mntlib43
/
mntlib
/
tcattr.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-01-15
|
5KB
|
198 lines
/*
Public domain termios tc[get|set]attr() for the MiNT library
10 October 1993 entropy@terminator.rs.itd.umich.edu -- first attempt
*/
#include <mintbind.h>
#include <types.h>
#include <errno.h>
#include <file.h>
#include <ioctl.h>
#include <unistd.h>
#include <types.h>
#include <termios.h>
int
tcgetattr(fd, stp)
int fd;
struct termios *stp;
{
struct sgttyb sg;
struct tchars t;
struct ltchars lt;
short flags;
long r;
r = Fcntl((short) fd, (long) &sg, TIOCGETP);
if (r < 0) {
errno = (int) -r;
return -1;
}
r = Fcntl((short) fd, (long) &t, TIOCGETC);
if (r < 0) {
errno = (int) -r;
return -1;
}
r = Fcntl((short) fd, (long) <, TIOCGLTC);
if (r < 0) {
errno = (int) -r;
return -1;
}
r = Fcntl((short) fd, (long) &flags, TIOCGFLAGS);
if (r < 0) {
flags = 0;
}
stp->c_iflag = (tcflag_t) (IGNBRK
| ((sg.sg_flags & CRMOD) ? ICRNL : 0)
| ((sg.sg_flags & (EVENP | ODDP)) ? INPCK : IGNPAR)
| ((sg.sg_flags & TANDEM) ? (IXON | IXOFF) : 0));
stp->c_oflag = (tcflag_t) OPOST;
stp->c_cflag = (tcflag_t) (CLOCAL | CREAD
| (((flags & _TF_STOPBITS) == _TF_2STOP) ? CSTOPB : 0)
| ((sg.sg_flags & EVENP) ? PARENB : 0)
| ((sg.sg_flags & ODDP) ? (PARENB | PARODD) : 0));
switch (flags & _TF_CHARBITS)
{
case _TF_5BIT:
stp->c_cflag |= CS5;
break;
case _TF_6BIT:
stp->c_cflag |= CS6;
break;
case _TF_7BIT:
stp->c_cflag |= CS7;
break;
case _TF_8BIT:
default:
stp->c_cflag |= CS8;
break;
}
stp->c_lflag = (tcflag_t) ((sg.sg_flags & (TOSTOP | NOFLSH))
| ((sg.sg_flags & ECHO) ? (ECHO | ECHOE | ECHOK) : 0)
| ((sg.sg_flags & XKEY) ? IEXTEN : 0)
| ((sg.sg_flags & RAW)
? 0
: ISIG | (sg.sg_flags & CBREAK ? 0 : ICANON)));
stp->_c_ispeed = (speed_t) sg.sg_ispeed;
stp->_c_ospeed = (speed_t) sg.sg_ospeed;
stp->c_cc[VEOF] = (cc_t) t.t_eofc;
stp->c_cc[VEOL] = (cc_t) t.t_brkc;
stp->c_cc[VERASE] = (cc_t) sg.sg_erase;
stp->c_cc[VINTR] = (cc_t) t.t_intrc;
stp->c_cc[VKILL] = (cc_t) sg.sg_kill;
stp->c_cc[VQUIT] = (cc_t) t.t_quitc;
stp->c_cc[VSUSP] = (cc_t) lt.t_suspc;
stp->c_cc[VSTART] = (cc_t) t.t_startc;
stp->c_cc[VSTOP] = (cc_t) t.t_stopc;
stp->c_cc[VMIN] = (cc_t) 1;
stp->c_cc[VTIME] = (cc_t) 0;
stp->c_cc[VLNEXT] = (cc_t) lt.t_lnextc;
stp->c_cc[VWERASE] = (cc_t) lt.t_werasc;
return 0;
}
int
tcsetattr(fd, action, stp)
int fd;
int action;
const struct termios *stp;
{
struct sgttyb sg;
struct tchars t;
struct ltchars lt;
short flags;
long r;
r = Fcntl((short) fd, (long) &sg, TIOCGETP);
if (r < 0) {
errno = (int) -r;
return -1;
}
r = Fcntl((short) fd, (long) <, TIOCGLTC);
if (r < 0) {
errno = (int) -r;
return -1;
}
r = Fcntl((short) fd, (long) &flags, TIOCGFLAGS);
if (r < 0) {
flags = 0;
}
sg.sg_flags &= ~(CRMOD | TANDEM | EVENP | ODDP | TOSTOP
| NOFLSH | RAW | CBREAK | ECHO | XKEY);
flags &= ~(_TF_STOPBITS | _TF_CHARBITS);
sg.sg_flags |= (((stp->c_iflag & ICRNL) ? CRMOD : 0)
| ((stp->c_iflag & (IXON | IXOFF)) ? TANDEM : 0));
flags |= ((stp->c_cflag & CSTOPB) ? _TF_2STOP : _TF_1STOP);
sg.sg_flags |= ((stp->c_cflag & PARENB)
? ((stp->c_cflag & PARODD) ? ODDP : EVENP)
: 0);
switch (stp->c_cflag & (CS5 | CS6 | CS7 | CS8))
{
case CS5:
flags |= _TF_5BIT;
break;
case CS6:
flags |= _TF_6BIT;
break;
case CS7:
flags |= _TF_7BIT;
break;
case CS8:
default:
flags |= _TF_8BIT;
break;
}
sg.sg_flags |= ((stp->c_lflag & (TOSTOP | NOFLSH | ECHO))
| ((stp->c_lflag & IEXTEN) ? XKEY : 0)
| ((stp->c_lflag & ISIG)
? (stp->c_lflag & ICANON ? 0 : CBREAK) : RAW));
sg.sg_ispeed = (char) stp->_c_ispeed;
sg.sg_ospeed = (char) stp->_c_ospeed;
t.t_eofc = (char) stp->c_cc[VEOF];
t.t_brkc = (char) stp->c_cc[VEOL];
sg.sg_erase = (char) stp->c_cc[VERASE];
t.t_intrc = (char) stp->c_cc[VINTR];
sg.sg_kill = (char) stp->c_cc[VKILL];
t.t_quitc = (char) stp->c_cc[VQUIT];
lt.t_suspc = (char) stp->c_cc[VSUSP];
t.t_startc = (char) stp->c_cc[VSTART];
t.t_stopc = (char) stp->c_cc[VSTOP];
lt.t_lnextc = (char) stp->c_cc[VLNEXT];
lt.t_werasc = (char) stp->c_cc[VWERASE];
switch (action)
{
case TCSAFLUSH:
tcflush(fd, TCIFLUSH);
/* fall through */
case TCSADRAIN:
r = Fcntl((short) fd, (long) &sg, TIOCSETP);
if (r < 0) {
errno = (int) -r;
return -1;
}
break;
case TCSANOW:
r = Fcntl((short) fd, (long) &sg, TIOCSETN);
if (r < 0) {
errno = (int) -r;
return -1;
}
break;
default:
errno = EINVAL;
return -1;
}
r = Fcntl((short) fd, (long) &t, TIOCSETC);
if (r < 0) {
errno = (int) -r;
return -1;
}
r = Fcntl((short) fd, (long) <, TIOCSLTC);
if (r < 0) {
errno = (int) -r;
return -1;
}
(void) Fcntl((short) fd, (long) &flags, TIOCSFLAGS);
return 0;
}